#include "include.h"

void setup() {
    /*  初始化LED灯IO口*/
    Led_blink_init();
    /*  初始化eeprom*/
    eeprom_init();
    /*  初始化串口*/
    serial_init();
    /*  查询设备网络状态-初始化*/
    Net_Status_Query_Init();
}

void loop() {
    
    /*  串口数据接收*/
    while(Serial.available()){
        ESP.wdtFeed();
        /*  装进串口数据缓冲数组中*/
        system_status.serial_buf = system_status.serial_buf + char(Serial.read());
        /*  delay 2ms,因为muc接收串口中缓存数据的速度比muc接受串口数据的速度快*/
        delay(2);
    }

    /*  如果缓冲数组中有数据*/
    if(system_status.serial_buf.length()>0){
        /*  打印*/
        // serial_println(system_status.serial_buf);
        /*  将json字符串转化成json对象*/
        system_status.json_object = JSON.parse(system_status.serial_buf);
        /*  如果解析失败，会报错*/
        if(JSON.typeof(system_status.json_object) == "undefined"){
            /*  用户输出*/
            user_serial_print("error-format\r\n");
        }
        else {
            if (system_status.json_object.hasOwnProperty("key")) {
                system_status.secret_key = (const char*) system_status.json_object["key"];
                /*  开始请求*/
                http_post_query_secret(system_status.serial_buf);
            }
            else if (system_status.json_object.hasOwnProperty("query")) {
                sprintf(system_status.debug_str, "status<%d>\r\n", system_status.net_status_last);
                /*  用户输出*/
                user_serial_print(system_status.debug_str);
            }
            /*  如果有 type 键名（type建明对应的是通讯协议）*/
            else if ((system_status.json_object.hasOwnProperty("type"))) {
                if(system_status.secret_key_value == true){
                    /*  获得通讯协议的名称*/
                    String type_name = (const char*) system_status.json_object["type"];
                    /*  如果是tcp协议*/
                    if(type_name == net_com_protocol.tcp){
                        /*  记录tcp服务器的参数*/
                        tcp_config_parameter.ip_add = (const char*) system_status.json_object["ip"];
                        tcp_config_parameter.ip_port = (const char*) system_status.json_object["port"];
                        tcp_config_parameter.msg = (const char*) system_status.json_object["msg"];
                        /*  记录当前的通讯协议是 tcp*/
                        system_status.current_protocol = "tcp";
                        /*  用户输出*/
                        user_serial_print("Ok\r\n");
                    }
                    /*  如果是htpp post协议*/
                    else if(type_name == net_com_protocol.post){
                        /*  记录当前的通讯协议是 post*/
                        http_config_parameter.server_ip = (const char*) system_status.json_object["url"];
                        http_config_parameter.parameter = (const char*) system_status.json_object["page"];
                        http_config_parameter.msg = (const char*) system_status.json_object["msg"]; 
                        system_status.current_protocol = "post";
                        /*  开始请求*/
                        http_post_request(http_config_parameter.msg);
                        /*  用户输出*/
                        user_serial_print("Ok\r\n");
                    }
                    /*  如果是htpp get协议*/
                    else if(type_name == net_com_protocol.get){
                        /*  记录当前的通讯协议是 get*/
                        http_config_parameter.server_ip = (const char*) system_status.json_object["url"];
                        http_config_parameter.parameter = (const char*) system_status.json_object["page"];
                        system_status.current_protocol = "get";
                        /*  开始请求*/
                        http_get_request();
                        /*  用户输出*/
                        user_serial_print("Ok\r\n");
                    }
                    /*  如果是udp协议*/
                    else if(type_name == net_com_protocol.udp){
                        /*  记录当前的通讯协议是 udp*/
                        udp_config_parameter.ip_add = (const char*) system_status.json_object["ip"];
                        udp_config_parameter.ip_local_port = (const char*) system_status.json_object["l_port"];
                        udp_config_parameter.ip_remote_port = (const char*) system_status.json_object["r_port"];
                        udp_config_parameter.msg = (const char*) system_status.json_object["msg"];
                        system_status.current_protocol = "udp";
                        /*  开始请求*/
                        udp_send_msg(udp_config_parameter.msg);
                        /*  用户输出*/
                        user_serial_print("Ok\r\n");
                    }
                    /*  如果是mqtt协议*/
                    else if(type_name == net_com_protocol.mqtt){
                        /*  记录当前的通讯协议是,mqtt*/
                        mqtt_config_parameter.ip_add = (const char*) system_status.json_object["url"];
                        mqtt_config_parameter.ip_port = (const char*) system_status.json_object["port"];
                        mqtt_config_parameter.msg_status_type = (const char*) system_status.json_object["m_type"];
                        mqtt_config_parameter.topic = (const char*) system_status.json_object["topic"];
                        mqtt_config_parameter.msg = (const char*) system_status.json_object["msg"];
                        mqtt_config_parameter.client_Id = (const char*) system_status.json_object["id"];
                        mqtt_config_parameter.user_name = (const char*) system_status.json_object["name"];
                        mqtt_config_parameter.user_pwd = (const char*) system_status.json_object["pwd"];
                        system_status.current_protocol = "mqtt";
                        /*  用户输出*/
                        user_serial_print("Ok\r\n");
                    }

                    /*  如果是其他的协议，报错*/
                    else {
                        /*  用户输出*/
                        user_serial_print("error-protocol\r\n");
                    }
                }
                else {
                    /*  用户输出*/
                    user_serial_print("error-secret\r\n");
                }
            }
        }
        /*  清空串口缓冲区，防止在过程中的串口数据 带来的影响*/
        system_status.serial_buf = "";
        /*  将串口缓冲区的数据清空*/
        serial_buf_clear();
    }

    /*  要在主循环中去重连，在中断中连接的话，muc看门狗会复位*/
    /*  没有连接WIFI*/
    if(system_status.net_status == NO_Connect_Wifi){
        system_status.net_status_last = system_status.net_status;
        switch_Led_Fre_Blink(Led_Blink_General_fast);
        system_status.Led_blink_interval = Led_Blink_General_fast;
        system_status.net_status = Other_Status;
        /*  重连*/
        wifi_reconnection();
    }
    /*  已经连接服务器*/
    else if(system_status.net_status == Connected_Server){
        system_status.net_status_last = system_status.net_status;
        switch_Led_Fre_Blink(Led_Blink_very_slow);
        system_status.Led_blink_interval = Led_Blink_very_slow;
        system_status.net_status = Other_Status;
    }
    /*  没有连接服务器*/
    else if(system_status.net_status == NO_Connect_Server){
        system_status.net_status_last = system_status.net_status;
        switch_Led_Fre_Blink(Led_Blink_General_slow);
        system_status.Led_blink_interval = Led_Blink_General_slow;
        system_status.net_status = Other_Status;
        /*  如果是TCP协议*/
        if(system_status.current_protocol == net_com_protocol.tcp){
            /*  调用TCP服务器重连函数*/
            tcp_server_reconnection();
        }
        else if(system_status.current_protocol == net_com_protocol.mqtt){
            /*  调用mqtt服务器重连函数*/
            mqtt_server_reconnect();
        }
    }
    client_CallBack_function();
}
